/**
 * 验证是否为手机号
 * @param phone 手机号 [string | number]
 */
export const isPhone = function (phone) {
    return /^1[3456789]\d{9}$/.test(phone + '');
};

/**
 * 验证是否为电话号
 * @param tel 电话号 [string | number]
 */
export const isTel = function (tel) {
    return /^(\d{3,4}-)?\d{7,8}$/.test(tel + '');
};

/**
 * 验证是否为邮箱
 * @param email 邮箱 [string]
 */
export const isEmail = function (email) {
    return /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(email + '');
};

/**
 * 是否为域名
 * @param url 域名 [string]
 */
export const isDomain = function (domain) {
    return /^([\w-]+\.)+[\w-]+$/.test(domain + '');
};

/**
 * 是否为网址
 * @param url 网址 [string]
 */
export const isUrl = function (url) {
    return /^([\w-]+\.)+[\w-]+(:\d+)?(\/?[\w-./?%&=#]*)?$/.test(url + '');
};

/**
 * 是否为带 http 或 https 或 // 的网址
 * @param url 地址 [string]
 */
export const isHttp = function (url) {
    return /^(https?:)?\/\/([\w-]+\.)+[\w-]+(:\d{1,5})?(\/?[\w-./?%&=#]*)?$/.test(url + '');
};

/**
 * 是否为qq号
 * @param qq qq号 [string | number]
 */
export const isQQ = function (qq) {
    return /[1-9][0-9]{4,}/.test(qq + '');
};

/**
 * 是否为微信号
 * @param wx 微信号 [string | number]
 */
export const isWX = function (wx) {
    return /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/.test(wx + '');
};

/**
 * 是否为银行卡号
 * @param code 卡号 [string | number]
 */
export const isBankCode = function (code) {
    return /^([1-9]{1})(\d{14}|\d{18})$/.test(code + '');
};

/**
 * 是否为身份证号
 * @param code 身份证号 [string | number]
 */
export const isIdCode = function (code) {
    return /^[1-9]\d{11,17}[\dxX]$/.test(code + '');
};

/**
 * 是否为中国邮政编码
 * @param code 邮政编码 [string | number]
 */
export const isPostCode = function (code) {
    return /^[1-9]\d{5}(?!\d)$/.test(code + '');
};

/**
 * 是否为IPV4
 * @param ip ipv4 [string]
 */
export const isIPV4 = function (ip) {
    return /^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$/.test(ip + '');
};

/**
 * 是否为IPV6
 * @param ip ipv6 [string]
 */
export const isIPV6 = function (ip) {
    return /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(ip + '');
};

/**
 * 是否为IP
 * @param ip ip [string]
 */
export const isIP = function (ip) {
    return isIPV4(ip) || isIPV6(ip);
};

/**
 * 是否为钱（支持 10000、 10000.00、 10,000、 10,000.00）
 * @param money 钱 [string | number]
 */
export const isMoney = function (money) {
    return /^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$/.test(money+'');
};

/**
 * 是否为日期（支持 YYYY-(MM|M)-(DD|D)）
 * @param date 日期 [string]
 */
export const isDate = function (date) {
    return /^\d{4}-\d{1,2}-\d{1,2}$/.test(date+'');
};

/**
 * 是否为整数
 * @param value 整数 [string | number]
 * @param digit 数字位正则 ['+' | '{number}' | '{number,}' | '{number,number}' | '?' | '*']
 */
export const isInt = function (value, digit = '+') {
    var regexp = new RegExp("^(\\-|\\+)?\\d" + digit + "$");
    return regexp.test(value + '');
};

/**
 * 是否为浮点数
 * @param value 浮点数 [string | number]
 * @param digit 小数位正则 ['+' | '{number}' | '{number,}' | '{number,number}' | '?' | '*']
 */
export const isFloat = function (value, digit = '+') {
    var regexp = new RegExp("^(\\-|\\+)?(\\d+)?\\.(\\d" + digit + ")$");
    return regexp.test(value + '');
};

/**
 * 是否为数字
 * @param value 数字 [string | number]
 * @param digit 小数位正则 ['+' | '{number}' | '{number,}' | '{number,number}' | '?' | '*']
 */
export const isNum = function (value, digit = '+') {
    return isInt(value, digit) || isFloat(value, digit);
};

/**
 * 是否为小写字母
 * @param value 小写字母 [string]
 * @param digit 字母位正则 ['+' | '{number}' | '{number,}' | '{number,number}' | '?' | '*']
 */
export const isLowerLetter = function (value, digit = '+') {
    var regexp = new RegExp("^[a-z]" + digit + "$");
    return regexp.test(value + '');
};

/**
 * 是否为大写字母
 * @param value 大写字母 [string]
 * @param digit 字母位正则 ['+' | '{number}' | '{number,}' | '{number,number}' | '?' | '*']
 */
export const isUpperLetter = function (value, digit = '+') {
    var regexp = new RegExp("^[A-Z]" + digit + "$");
    return regexp.test(value + '');
};

/**
 * 是否为字母
 * @param value 字母 [string]
 * @param digit 字母位正则 ['+' | '{number}' | '{number,}' | '{number,number}' | '?' | '*']
 */
export const isLetter = function (value, digit = '+') {
    var regexp = new RegExp("^[a-zA-Z]" + digit + "$");
    return regexp.test(value + '');
};

/**
 * 是否为数字或字母
 * @param value 数字或字母 [string | number]
 * @param digit 字母位正则 ['+' | '{number}' | '{number,}' | '{number,number}' | '?' | '*']
 */
export const isNumberOrLetter = function (value, digit = '+') {
    return isLetter(value + '', digit) || isNumber(value, digit);
};

/**
 * 是否为数字+字母(必须同时包含数字和字母)
 * @param value 数字+字母 [string]
 * @param digit 字母位正则 ['+' | '{number}' | '{number,}' | '{number,number}' | '?' | '*']
 */
export const isNumberAndLetter = function (value, digit = '+') {
    var regexp = new RegExp("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]" + digit + "$");
    return regexp.test(value + '');
};
